home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 12 - 1996 / 12.11 Nov 96 / DebuggingStarter Code / DebugTraps.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-09  |  17.7 KB  |  932 lines  |  [TEXT/CWIE]

  1. /*________________________________________________________________________________
  2.     DebugTraps.c: includes all general purpose debugging code.
  3. ________________________________________________________________________________*/
  4.  
  5. #include "Debug.h"
  6.  
  7. #include "DebugTrapsOff.h"
  8.  
  9.  
  10. #if USE_DEBUG_TRAPS    // [
  11.  
  12. #include "DebugLeaks.h"
  13.  
  14. #define kHStatePurgeableMask    0x40
  15. #define kHStateLockedMask        0x80
  16. #define kHStateResourceMask        0x20
  17.  
  18. #define HStateIsPurgeable(hState)    ( ((hState) & kHStatePurgeableMask) != 0 )
  19. #define HStateIsLocked(hState)        ( ((hState) & kHStateLockedMask) != 0 )
  20. #define HStateIsResource(hState)    ( ((hState) & kHStateResourceMask) != 0 )
  21.  
  22.  
  23. #if USE_DEBUG_LEAKS
  24.     #define MaybeUnusedArg(x)    {/*nothing*/}
  25. #else
  26.     // eliminate "unused argument" complaints from CodeWarrior
  27.     #define MaybeUnusedArg(x)        {(x)    = (x);}
  28. #endif
  29.  
  30.  
  31. /*________________________________________________________________________________
  32.     Errors such as 'noErr' and 'memFullErr' are normal because they can occur
  33.     in normal usage with no adverse consequences. Other errors, which indicate
  34.     a bad handle, heap, etc are not normal.
  35. ________________________________________________________________________________*/
  36.     static Boolean
  37. MemErrIsNormal( OSErr    err)
  38.     {
  39.     return( IsntErr( err ) || err == memFullErr );
  40.     }
  41.  
  42.  
  43.     static void
  44. AssertMemErrIsNormal( ConstStr255Param msg)
  45.     {
  46.     OSErr    err;
  47.     
  48.     err    = LMGetMemErr();
  49.     if ( ! MemErrIsNormal( err ) )
  50.         {
  51.         AssertNoErr( err, msg);
  52.         }
  53.     }
  54.  
  55.  
  56. #define HandleIsPurged(h)        ( IsNil( *(h) ) )
  57.  
  58.     static Boolean
  59. HandleIsPurgeable( Handle    h)
  60.     {
  61.     char    hState;
  62.     
  63.     hState    = HGetState( h );
  64.     
  65.     return( HStateIsPurgeable( hState ) );
  66.     }
  67.  
  68.  
  69.     static Boolean
  70. HandleIsLocked( Handle    h)
  71.     {
  72.     char    hState;
  73.     #define kHStatePurgeableMask    0x40
  74.     #define kHStateLockedMask        0x80
  75.     
  76.     hState    = HGetState( h );
  77.     
  78.     return( HStateIsLocked( hState ) );
  79.     }
  80.  
  81.  
  82.     static Boolean
  83. HandleIsPurgeableAndNotLocked( Handle h )
  84.     {
  85.     return( HandleIsPurgeable(h) && ! HandleIsLocked( h ) );
  86.     }
  87.  
  88.  
  89. /*________________________________________________________________________________
  90.     Fill memory with a byte pattern.  Obviously, this routine can be optimized.
  91. ________________________________________________________________________________*/
  92.     static void
  93. FillMemory(
  94.     void    *buffer,
  95.     UInt32    byteCount,
  96.     Byte    fillChar)
  97.     {
  98.     char    *cur;
  99.     UInt32    counter;
  100.     
  101.     cur        = (char *)buffer;
  102.     counter    = byteCount;
  103.     while ( counter-- != 0 )
  104.         {
  105.         *cur++    = fillChar;
  106.         }
  107.     }
  108.     
  109.     
  110.     static void
  111. FillWithGarbage(
  112.     void    *ptr,
  113.     UInt32    byteCount)
  114.     {
  115.     FillMemory( ptr, byteCount, 0xBB );
  116.     }
  117.  
  118.  
  119.     static Boolean
  120. IsValidMemoryAllocationSize(Size    theSize)
  121.     {
  122.     // choose the highest value that you anticipate
  123.     #define kMaxReasonableAllocation        (128 * 1024UL * 1024UL )
  124.  
  125.     return( theSize >= 0 && theSize <= kMaxReasonableAllocation );
  126.     }
  127.  
  128.  
  129.     static void
  130. AssertValidMemoryAllocationSize(
  131.     Size            byteCount,
  132.     ConstStr255Param    msg)
  133.     {
  134.     if ( ! IsValidMemoryAllocationSize( byteCount ) )
  135.         {
  136.         DebugNum( msg, byteCount);
  137.         }
  138.     }
  139.  
  140.  
  141. #if PRAGMA_MARK_SUPPORTED
  142. #pragma mark -
  143. #pragma mark --- Memory Manager ---
  144. #endif
  145.  
  146.  
  147.     pascal void
  148. DebugTraps_DisposeHandle(Handle h)
  149.     {
  150.     UInt32    hSize;
  151.     SInt8    hState;
  152.     
  153.     AssertHandleIsValid( h, "\pDebugTraps_DisposeHandle");
  154.     DebugLeaks_DisposingHandle( h );
  155.     DebugLeaks_ForgetHandle( h );
  156.     
  157.     hState    = HGetState( h );
  158.     Assert( ! HStateIsResource( hState ),
  159.         "\pDebugTraps_DisposeHandle: this Handle is a resource. Use ReleaseResource");
  160.     
  161.     // fill the handle with junk prior to disposing it
  162.     hSize    = GetHandleSize( h );
  163.     if ( MemError() == noErr )
  164.         {
  165.         FillWithGarbage( *h, hSize);
  166.         }
  167.     
  168.     DisposeHandle( h );
  169.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_DisposeHandle");
  170.     }
  171.  
  172.     
  173. #define kMaxReasonableBlockMove        (64 * 1024UL * 1024UL )
  174.  
  175.     pascal void
  176. DebugTraps_BlockMove(
  177.     const void    *srcPtr,
  178.     void        *destPtr,
  179.     Size        byteCount)
  180.     {
  181.     const void    *sysZone;
  182.     
  183.     AssertAddressIsValid( srcPtr, "\pDebugTraps_BlockMove");
  184.     AssertAddressIsValid( destPtr, "\pDebugTraps_BlockMove");
  185.     
  186.     Assert( byteCount >= 0, "\pDebugTraps_BlockMove: negative byte count");
  187.     Assert( byteCount <= kMaxReasonableBlockMove, "\pDebugTraps_BlockMove: count is huge...is this correct?");
  188.     
  189.     sysZone    = SystemZone();
  190.     Assert( srcPtr >= (void *)sysZone, "\pDebugTraps_BlockMove: srcPtr below system zone");
  191.     Assert( destPtr >= (void *)sysZone, "\pDebugTraps_BlockMove: destPtr below system zone");
  192.     
  193.     
  194.     BlockMove( srcPtr, destPtr, byteCount);
  195.     }
  196.  
  197.  
  198.     pascal void
  199. DebugTraps_BlockMoveData(
  200.     const void    *srcPtr,
  201.     void        *destPtr,
  202.     Size        byteCount)
  203.     {
  204.     const void    *sysZone;
  205.     
  206.     AssertAddressIsValid( srcPtr, "\pDebugTraps_BlockMoveData");
  207.     AssertAddressIsValid( destPtr, "\pDebugTraps_BlockMoveData");
  208.     
  209.     Assert( byteCount >= 0, "\pDebugTraps_BlockMoveData: negative byte count");
  210.     Assert( byteCount <= kMaxReasonableBlockMove, "\pDebugTraps_BlockMoveData: count is huge...is this correct?");
  211.  
  212.     sysZone    = SystemZone();
  213.     Assert( srcPtr >= (void *)sysZone, "\pDebugTraps_BlockMoveData: srcPtr below system zone");
  214.     Assert( destPtr >= (void *)sysZone, "\pDebugTraps_BlockMoveData: destPtr below system zone");
  215.     
  216.     
  217.     BlockMoveData( srcPtr, destPtr, byteCount);
  218.     }
  219.  
  220.  
  221.     pascal Handle
  222. DebugTraps_NewHandle(
  223.     Size        byteCount,
  224.     const char    *srcFileName)
  225.     {
  226.     Handle    h;
  227.     
  228.     Assert( byteCount >= 0, "\pDebugTraps_NewHandle: negative count");
  229.         
  230.     h    = NewHandle( byteCount );
  231.     AssertMemErrIsNormal( "\pDebugTraps_NewHandle" );
  232.     
  233.     // byteCount is tested as well, because the memory manager has a bug that
  234.     // causes it to succeed in creating a valid handle for small negative sizes.
  235.     // this bug may be fixed in 7.5.3 update 3.0
  236.     if ( IsntNil( h ) && byteCount > 0 && LMGetMemErr() == noErr )
  237.         {
  238.         FillWithGarbage( *h, byteCount);
  239.         
  240.         MaybeUnusedArg( srcFileName );
  241.         DebugLeaks_RememberHandle( h, kLeaks_NewHandle, srcFileName);
  242.         }
  243.     
  244.     return( h );
  245.     }
  246.  
  247.  
  248.  
  249.  
  250.     pascal Handle
  251. DebugTraps_NewHandleClear(
  252.     Size        byteCount,
  253.     const char    *srcFileName)
  254.     {
  255.     Handle    h;
  256.     
  257.     AssertValidMemoryAllocationSize( byteCount, "\p DebugTraps_NewHandleClear");
  258.         
  259.     h    = NewHandleClear( byteCount );
  260.     AssertMemErrIsNormal( "\pDebugTraps_NewHandleClear" );
  261.     
  262.     if ( IsntNil( h ) )
  263.     {    
  264.         MaybeUnusedArg( srcFileName );
  265.         DebugLeaks_RememberHandle( h, kLeaks_NewHandleClear, srcFileName);
  266.     }
  267.     
  268.     return( h );
  269.     }
  270.  
  271.     pascal Handle
  272. DebugTraps_NewHandleSys(
  273.     Size        byteCount,
  274.     const char    *srcFileName)
  275.     {
  276.     Handle    h;
  277.     
  278.     AssertValidMemoryAllocationSize( byteCount, "\p DebugTraps_NewHandleSys");
  279.         
  280.     h    = NewHandleSys( byteCount );
  281.     AssertMemErrIsNormal( "\pDebugTraps_NewHandleSys" );
  282.     
  283.     if ( IsntNil( h ) && LMGetMemErr() == noErr )
  284.         {
  285.         FillWithGarbage( *h, byteCount);
  286.         
  287.         MaybeUnusedArg( srcFileName );
  288.         DebugLeaks_RememberHandle( h, kLeaks_NewHandleSys, srcFileName);
  289.         }
  290.     
  291.     return( h );
  292.     }
  293.  
  294.  
  295.     pascal Handle
  296. DebugTraps_NewHandleSysClear(
  297.     Size        byteCount,
  298.     const char    *srcFileName)
  299.     {
  300.     Handle    h;
  301.     
  302.     AssertValidMemoryAllocationSize( byteCount, "\p DebugTraps_NewHandleSysClear");
  303.         
  304.     h    = NewHandleSysClear( byteCount );
  305.     AssertMemErrIsNormal( "\pDebugTraps_NewHandleSysClear" );
  306.     
  307.     if ( IsntNil( h ) )
  308.     {
  309.         MaybeUnusedArg( srcFileName );
  310.         DebugLeaks_RememberHandle( h, kLeaks_NewHandleSysClear, srcFileName);
  311.     }
  312.     
  313.     return( h );
  314.     }
  315.  
  316.  
  317.     pascal Size
  318. DebugTraps_GetHandleSize(Handle h )
  319.     {
  320.     Size    theSize;
  321.     OSErr    err;
  322.     
  323.     AssertHandleIsValid( h, "\pDebugTraps_GetHandleSize");
  324.     
  325.     theSize    = GetHandleSize( h );
  326.     
  327.     err    = LMGetMemErr();
  328.     if ( err == nilHandleErr && IsNil( *h ) )
  329.         {
  330.         // normal to get this on purged Handle
  331.         }
  332.     else
  333.         {
  334.         AssertNoErr( err, "\pDebugTraps_GetHandleSize");
  335.         }
  336.     
  337.     return( theSize );
  338.     }
  339.  
  340.  
  341.  
  342.     pascal OSErr
  343. DebugTraps_PtrToHand(
  344.     const void    *srcPtr,
  345.     Handle        *dstHndl,
  346.     long        size,
  347.     const char    *srcFileName)
  348.     {
  349.     OSErr    err;
  350.     
  351.     AssertAddressIsValid( srcPtr, "\pDebugTraps_PtrToHand");
  352.     AssertAddressIsValid( dstHndl, "\pDebugTraps_PtrToHand");
  353.     Assert( IsValidMemoryAllocationSize( size ), "\pDebugTraps_PtrToHand");
  354.     
  355.     err    = PtrToHand( srcPtr, dstHndl, size);
  356.     AssertNoErr( err, "\pDebugTraps_PtrToHand");
  357.     
  358.     if ( IsntErr( err ) && IsntNil( *dstHndl ) )
  359.         {
  360.         MaybeUnusedArg( srcFileName );
  361.         DebugLeaks_RememberHandle( *dstHndl, kLeaks_PtrToHand, srcFileName);
  362.         }
  363.     
  364.     return( err );
  365.     }
  366.  
  367.  
  368.     pascal Ptr
  369. DebugTraps_NewPtr(
  370.     Size        byteCount,
  371.     const char    *srcFileName)
  372.     {
  373.     Ptr    p;
  374.     
  375.     AssertValidMemoryAllocationSize( byteCount, "\p DebugTraps_NewPtr");
  376.         
  377.     p    = NewPtr( byteCount );
  378.     AssertMemErrIsNormal( "\pDebugTraps_NewPtr" );
  379.     
  380.     if ( IsntNil( p ) && LMGetMemErr() == noErr )
  381.         {
  382.         FillWithGarbage( p, byteCount);
  383.         
  384.         MaybeUnusedArg( srcFileName );
  385.         DebugLeaks_RememberPtr( p, kLeaks_NewPtr, srcFileName);
  386.         }
  387.     
  388.     return( p );
  389.     }
  390.  
  391.  
  392.     pascal Ptr
  393. DebugTraps_NewPtrClear(
  394.     Size        byteCount,
  395.     const char    *srcFileName)
  396.     {
  397.     Ptr    p;
  398.     
  399.     AssertValidMemoryAllocationSize( byteCount, "\pDebugTraps_NewPtrClear");
  400.         
  401.     p    = NewPtrClear( byteCount );
  402.     AssertMemErrIsNormal( "\pDebugTraps_NewPtrClear" );
  403.     
  404.     if ( IsntNil( p ) )
  405.     {
  406.         MaybeUnusedArg( srcFileName );
  407.         DebugLeaks_RememberPtr( p, kLeaks_NewPtrClear, srcFileName);
  408.     }
  409.     
  410.     return( p );
  411.     }
  412.  
  413.  
  414.     pascal Ptr
  415. DebugTraps_NewPtrSys(
  416.     Size        byteCount,
  417.     const char    *srcFileName)
  418.     {
  419.     Ptr    p;
  420.     
  421.     AssertValidMemoryAllocationSize( byteCount, "\p DebugTraps_NewPtrSys");
  422.     
  423.     p    = NewPtrSys( byteCount );
  424.     AssertMemErrIsNormal( "\pDebugTraps_NewPtrSys" );
  425.     
  426.     if ( IsntNil( p ) && LMGetMemErr() == noErr )
  427.         {
  428.         FillWithGarbage( p, byteCount);
  429.         
  430.         MaybeUnusedArg( srcFileName );
  431.         DebugLeaks_RememberPtr( p, kLeaks_NewPtrSys, srcFileName);
  432.         }
  433.     
  434.     return( p );
  435.     }
  436.  
  437.  
  438.     pascal Ptr
  439. DebugTraps_NewPtrSysClear(
  440.     Size        byteCount,
  441.     const char    *srcFileName)
  442.     {
  443.     Ptr    p;
  444.     
  445.     AssertValidMemoryAllocationSize( byteCount, "\p DebugTraps_NewPtrSysClear");
  446.     
  447.     p    = NewPtrSysClear( byteCount );
  448.     
  449.     AssertMemErrIsNormal( "\pDebugTraps_NewPtrSysClear" );
  450.     
  451.     if ( IsntNil( p ) )
  452.     {
  453.         MaybeUnusedArg( srcFileName );
  454.         DebugLeaks_RememberPtr( p, kLeaks_NewPtrSysClear, srcFileName);
  455.     }
  456.     
  457.     return( p );
  458.     }
  459.  
  460.  
  461.     pascal Size
  462. DebugTraps_GetPtrSize(Ptr p)
  463.     {
  464.     Size    theSize;
  465.     
  466.     theSize    = GetPtrSize( p );
  467.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_GetPtrSize" );
  468.     
  469.     return( theSize );
  470.     }
  471.  
  472.  
  473.     pascal void
  474. DebugTraps_SetPtrSize(
  475.     Ptr        p,
  476.     Size    newSize)
  477.     {
  478.     AssertValidMemoryAllocationSize( newSize, "\p DebugTraps_SetPtrSize");
  479.     
  480.     SetPtrSize( p, newSize);
  481.     
  482.     AssertMemErrIsNormal( "\pDebugTraps_SetPtrSize" );
  483.     }
  484.  
  485.  
  486.     pascal THz
  487. DebugTraps_PtrZone(Ptr p)
  488.     {
  489.     THz    zone;
  490.     
  491.     zone    = PtrZone( p );
  492.     AssertMemErrIsNormal( "\pDebugTraps_PtrZone" );
  493.     
  494.     return( zone );
  495.     }
  496.  
  497.  
  498.     pascal void
  499. DebugTraps_DisposePtr(Ptr p)
  500.     {
  501.     UInt32    ptrSize;
  502.     
  503.     AssertAddressIsValidAlign2( p, "\pDebugTraps_DisposePtr");
  504.     
  505.     DebugLeaks_DisposingPtr( p );
  506.     
  507.     // fill the handle with junk prior to disposing it
  508.     ptrSize    = GetPtrSize( p );
  509.     if ( LMGetMemErr() == noErr )
  510.         {
  511.         FillWithGarbage( p, ptrSize);
  512.         }
  513.     
  514.     DisposePtr( p );
  515.     DebugLeaks_ForgetPtr( p );
  516.     
  517.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_DisposePtr");
  518.     }
  519.  
  520.  
  521.  
  522.  
  523.     pascal void
  524. DebugTraps_SetHandleSize(
  525.     Handle    h,
  526.     Size    newSize)
  527.     {
  528.     Size    oldSize;
  529.     SInt8    hState;
  530.     OSErr    err    = noErr;
  531.     
  532.     AssertValidMemoryAllocationSize( newSize, "\p DebugTraps_SetHandleSize");
  533.     AssertHandleIsValid( h, "\pDebugTraps_SetHandleSize");
  534.     
  535.     hState    = DebugTraps_HGetState( h );
  536.     Assert( (hState & kHStateLockedMask) == 0,
  537.         "\pDebugTraps_SetHandleSize: changing size of locked Handle is a bug on System 8");
  538.         
  539.     oldSize    = GetHandleSize( h );
  540.     
  541.     SetHandleSize( h, newSize);
  542.     err    = LMGetMemErr();
  543.     AssertMemErrIsNormal( "\pDebugTraps_SetHandleSize" );
  544.     
  545.     // we should either have the correct size Handle or an error
  546.     Assert( IsErr( err ) || GetHandleSize( h ) == newSize,
  547.         "\pDebugTraps_SetHandleSize: inconsistent results");
  548.     
  549.     if ( (newSize > oldSize) && IsntErr( err )  )
  550.         {
  551.         FillWithGarbage( ((char *)*h) + oldSize, newSize - oldSize);
  552.         }
  553.     }
  554.  
  555.  
  556.     pascal void
  557. DebugTraps_ReallocateHandle(
  558.     Handle    h,
  559.     Size    byteCount)
  560.     {
  561.     AssertValidMemoryAllocationSize( byteCount, "\p DebugTraps_ReallocateHandle");
  562.     AssertHandleIsValid( h, "\pDebugTraps_ReallocateHandle");
  563.     
  564.     ReallocateHandle( h, byteCount);
  565.     
  566.     if ( LMGetMemErr() == noErr )
  567.         {
  568.         FillWithGarbage( *h, byteCount);
  569.         }
  570.     else
  571.         {
  572.         AssertMemErrIsNormal( "\pDebugTraps_ReallocateHandle" );
  573.         }
  574.     }
  575.  
  576.  
  577.     pascal void
  578. DebugTraps_HLock(Handle h)
  579.     {
  580.     AssertHandleIsValid( h, "\pstdHLock");
  581.     Assert( ! HandleIsPurged(h), "\pDebugTraps_HLock: locking purged Handle");
  582.     
  583.     HLock( h );
  584.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_HLock");
  585.     }
  586.  
  587.  
  588.     pascal void
  589. DebugTraps_HUnlock(Handle h)
  590.     {
  591.     AssertHandleIsValid( h, "\pstdHUnlock");
  592.     
  593.     HUnlock( h );
  594.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_HUnlock");
  595.     }
  596.  
  597.  
  598.     pascal SInt8
  599. DebugTraps_HGetState(Handle h)
  600.     {
  601.     SInt8    hState;
  602.     OSErr    err;
  603.     
  604.     AssertHandleIsValid( h, "\pDebugTraps_HGetState");
  605.     
  606.     hState    = HGetState( h );
  607.     
  608.     err    = LMGetMemErr();
  609.     if ( err == nilHandleErr && IsNil( *h ) )
  610.         {
  611.         // normal to get this on purged Handle
  612.         }
  613.     else
  614.         {
  615.         AssertNoErr( err, "\pDebugTraps_HGetState");
  616.         }
  617.     
  618.     return( hState );
  619.     }
  620.  
  621.  
  622.     pascal void
  623. DebugTraps_HSetState(
  624.     Handle    h,
  625.     SInt8    flags)
  626.     {
  627.     OSErr    err;
  628.     
  629.     AssertHandleIsValid( h, "\pDebugTraps_HSetState");
  630.     
  631.     HSetState( h, flags);
  632.     
  633.     err    = LMGetMemErr();
  634.     if ( err == nilHandleErr && IsNil( *h ) )
  635.         {
  636.         // normal to get this on purged Handle
  637.         }
  638.     else
  639.         {
  640.         AssertNoErr( err, "\pDebugTraps_HSetState");
  641.         }
  642.     }
  643.  
  644.  
  645.     pascal OSErr
  646. DebugTraps_HandAndHand(
  647.     Handle    hand1,
  648.     Handle    hand2)
  649.     {
  650.     OSErr    err;
  651.     
  652.     AssertHandleIsValid( hand1, "\pDebugTraps_HandAndHand");
  653.     AssertHandleIsValid( hand2, "\pDebugTraps_HandAndHand");
  654.     Assert( ! HandleIsPurgeableAndNotLocked( hand1 ), "\pDebugTraps_HandAndHand: purgeable hand1");
  655.     Assert( ! HandleIsPurgeableAndNotLocked( hand2 ), "\pDebugTraps_HandAndHand: purgeable hand2");
  656.     
  657.     err    = HandAndHand( hand1, hand2 );
  658.     AssertMemErrIsNormal( "\pDebugTraps_HandAndHand" );
  659.     
  660.     return( err );
  661.     }
  662.  
  663.  
  664.     pascal OSErr
  665. DebugTraps_HandToHand(
  666.     Handle        *theHandlePtr,
  667.     const char    *srcFileName)
  668.     {
  669.     OSErr    err;
  670.     Handle    temp;
  671.     
  672.     AssertHandleIsValid( *theHandlePtr, "\pDebugTraps_HandToHand");
  673.     Assert( ! HandleIsPurgeableAndNotLocked( *theHandlePtr ),
  674.         "\pDebugTraps_HandToHand: attempt to duplicate purgeable Handle");
  675.     
  676.     temp    = *theHandlePtr;
  677.     err    = HandToHand( theHandlePtr );
  678.     AssertMemErrIsNormal( "\pDebugTraps_HandToHand" );
  679.     
  680.     if ( IsntErr( err ) )
  681.     {
  682.         Assert( GetHandleSize( temp ) == GetHandleSize( *theHandlePtr ),
  683.             "\pDebugTraps_HandToHand: different size");
  684.             
  685.         Assert( temp != *theHandlePtr, "\pDebugTraps_HandToHand: handle the same");
  686.         MaybeUnusedArg( srcFileName );
  687.         DebugLeaks_RememberHandle( *theHandlePtr, kLeaks_HandToHand, srcFileName);
  688.     }
  689.     
  690.     return( err );
  691.     }
  692.  
  693.  
  694.     pascal void
  695. DebugTraps_HPurge(Handle h)
  696.     {
  697.     OSErr    err;
  698.     
  699.     AssertHandleIsValid( h, "\pDebugTraps_HPurge");
  700.     
  701.     HPurge( h );
  702.     
  703.     err    = LMGetMemErr();
  704.     if ( err == nilHandleErr && IsNil( *h ) )
  705.         {
  706.         // normal to get error on purged Handle
  707.         }
  708.     else
  709.         {
  710.         AssertNoErr( err, "\pDebugTraps_HPurge");
  711.         }
  712.     }
  713.  
  714.  
  715.     pascal void
  716. DebugTraps_EmptyHandle(Handle    h)
  717.     {
  718.     OSErr    err;
  719.     UInt32    hSize;
  720.     
  721.     AssertHandleIsValid( h, "\pDebugTraps_EmptyHandle");
  722.     
  723.     hSize    = GetHandleSize( h );
  724.     if ( LMGetMemErr() == noErr )
  725.         {
  726.         Assert( IsntNil( *h ), "\pDebugTraps_EmptyHandle: master pointer is nil");
  727.         FillWithGarbage( *h, hSize);
  728.         }
  729.     
  730.     EmptyHandle( h );
  731.     err    = LMGetMemErr();
  732.     AssertNoErr( err, "\pDebugTraps_EmptyHandle");
  733.     }
  734.  
  735.  
  736.     pascal void
  737. DebugTraps_HNoPurge(Handle h)
  738.     {
  739.     AssertHandleIsValid( h, "\pDebugTraps_HNoPurge");
  740.     Assert( ! HandleIsPurged(h), "\pDebugTraps_HNoPurge: handle already purged");
  741.     
  742.     HNoPurge( h );
  743.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_HNoPurge");
  744.     }
  745.  
  746.  
  747.     pascal THz
  748. DebugTraps_HandleZone(Handle h)
  749.     {
  750.     THz        zone;
  751.     AssertHandleIsValid( h, "\pDebugTraps_HandleZone");
  752.     
  753.     zone    = HandleZone( h );
  754.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_HandleZone");
  755.     Assert( IsntNil( zone ), "\pDebugTraps_HandleZone");
  756.     
  757.     return( zone );
  758.     }
  759.  
  760.  
  761.     pascal Handle
  762. DebugTraps_RecoverHandle(Ptr p)
  763.     {
  764.     Handle    h;
  765.     
  766.     AssertAddressIsValidAlign2( p, "\pDebugTraps_RecoverHandle");
  767.     
  768.     h    = RecoverHandle( p );
  769.     
  770.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_RecoverHandle");
  771.     AssertHandleIsValid( h, "\pDebugTraps_RecoverHandle");
  772.     
  773.     return( h );
  774.     }
  775.  
  776.  
  777.     pascal Handle
  778. DebugTraps_RecoverHandleSys(Ptr p)
  779.     {
  780.     Handle    h;
  781.     
  782.     AssertAddressIsValidAlign2( p, "\pDebugTraps_RecoverHandleSys");
  783.     
  784.     h    = RecoverHandleSys( p );
  785.     
  786.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_RecoverHandleSys");
  787.     AssertHandleIsValid( h, "\pDebugTraps_RecoverHandleSys");
  788.     
  789.     return( h );
  790.     }
  791.  
  792.  
  793.     pascal void
  794. DebugTraps_SetZone(THz hz)
  795.     {
  796.     AssertAddressIsValidAlign4( hz, "\pDebugTraps_SetZone");
  797.     
  798.     SetZone( hz );
  799.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_SetZone");
  800.     }
  801.  
  802.  
  803.     pascal THz
  804. DebugTraps_GetZone()
  805.     {
  806.     THz    hz;
  807.     
  808.     hz    = GetZone();
  809.     AssertNoErr( LMGetMemErr(), "\pDebugTraps_GetZone");
  810.     
  811.     return( hz );
  812.     }
  813.  
  814.  
  815.     pascal Handle
  816. DebugTraps_TempNewHandle(
  817.     Size        logicalSize,
  818.     OSErr        *resultCode,
  819.     const char    *srcFileName)
  820.     {
  821.     Handle    h;
  822.     
  823.     AssertValidMemoryAllocationSize( logicalSize, "\pDebugTraps_TempNewHandle");
  824.     
  825.     AssertAddressIsValidAlign2( resultCode, "\pDebugTraps_TempNewHandle");
  826.     
  827.     h    = TempNewHandle( logicalSize, resultCode);
  828.  
  829.     if ( ! MemErrIsNormal( *resultCode ) )
  830.         {
  831.         AssertNoErr( *resultCode, "\pDebugTraps_TempNewHandle");
  832.         }
  833.     
  834.     if ( IsntNil( h ) && *resultCode == noErr )
  835.         {
  836.         FillWithGarbage( *h, logicalSize);
  837.         
  838.         MaybeUnusedArg( srcFileName );
  839.         DebugLeaks_RememberHandle( h, kLeaks_TempNewHandle, srcFileName);
  840.         }
  841.     
  842.     return( h );
  843.     }
  844.  
  845.  
  846.     pascal void
  847. DebugTraps_TempDisposeHandle(
  848.     Handle    h,
  849.     OSErr    *err)
  850.     {
  851.     AssertHandleIsValid( h , "\p DebugTraps_TempDisposeHandle");
  852.     
  853.     TempDisposeHandle( h, err);
  854.     AssertNoErr( *err, "\p DebugTraps_TempDisposeHandle");
  855.     
  856.     DebugLeaks_ForgetHandle( h );
  857.     }
  858.  
  859.  
  860.     pascal void
  861. DebugTraps_MoveHHi(Handle h)
  862.     {
  863.     AssertHandleIsValid( h , "\p DebugTraps_MoveHHi");
  864.     
  865.     MoveHHi( h );
  866.     
  867.     AssertNoErr( LMGetMemErr(), "\p DebugTraps_MoveHHi");
  868.     }
  869.  
  870.  
  871.     pascal OSErr
  872. DebugTraps_PtrAndHand(
  873.     const void    *ptr,
  874.     Handle        hand,
  875.     long        size)
  876.     {
  877.     OSErr    err;
  878.     
  879.     AssertHandleIsValid( hand , "\p DebugTraps_PtrAndHand");
  880.     AssertAddressIsValid( ptr , "\p DebugTraps_PtrAndHand");
  881.     AssertValidMemoryAllocationSize( size, "\pDebugTraps_PtrAndHand");
  882.     
  883.     err    = PtrAndHand( ptr, hand, size);
  884.     
  885.     if ( ! MemErrIsNormal( err ) )
  886.         {
  887.         AssertNoErr( err, "\p DebugTraps_PtrAndHand");
  888.         }
  889.     
  890.     return( err );
  891.     }
  892.  
  893.  
  894.  
  895. #endif // ] USE_DEBUG_TRAPS
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.